//
//  CustomPlugin.swift
//  Swift_Weibo
//
//  Created by Tim on 2019/9/6.
//  Copyright © 2019 Tim. All rights reserved.
//

import Foundation
import Chrysan
import Result
import Moya

struct CustomPlugin: PluginType {
    func prepare(_ request: URLRequest, target: TargetType) -> URLRequest {
        let url = (request.url?.absoluteString)!
        let body = String(data: request.httpBody ?? "没有参数".data(using: .utf8)!, encoding: .utf8)!
        let header = request.allHTTPHeaderFields ?? ["请求头" : "无"]
        let method = request.httpMethod!
        debugLog("\n请求方式:\(method)\n请求URL:\(url)\n请求体:\(body)\n头信息:\(header)\n")
        return request
    }
    
    func willSend(_ request: RequestType, target: TargetType) {
        switch target.path {
        case "/2/statuses/home_timeline.json":
            break
        default:
            UIApplication.shared.keyWindow?.chrysan.showMessage("加载中...")
        }
    }
    
    func didReceive(_ result: Result<Response, MoyaError>, target: TargetType) {
        UIApplication.shared.keyWindow?.chrysan.hide()
        switch result {
        case .success(let response):
            do {
                guard let json = try response.mapJSON() as? [String : Any] else {
                    return
                }
                if let errorCode = json["error_code"] as? Int {
                    errorCodeHandler(errorCode: errorCode)
                    return
                }
                debugLog(json)
            } catch {
                debugLog("数据解析失败")
            }
        case .failure(let error):
            if error.errorCode == 403 {
                debugLog("access_token过期，请求再授权")
                // FIXME: - 发起通知请求再授权
            }
            debugLog(error)
        }
    }
    
    func process(_ result: Result<Response, MoyaError>, target: TargetType) -> Result<Response, MoyaError> {
        debugLog("请求完毕")
        return result
    }
    
    /// 处理微博 SDK 错误代码
    ///
    /// - Parameter errorCode: 错误码
    fileprivate func errorCodeHandler(errorCode: Int) {
        switch errorCode {
        case 10001:
            showMsg("系统错误")
        case 10002:
            showMsg("服务暂停")
        case 10003:
            showMsg("远程服务错误")
        case 10004:
            showMsg("IP限制不能请求该资源")
        case 10005:
            showMsg("该资源需要appkey拥有授权")
        case 10006:
            showMsg("缺少source (appkey) 参数")
        case 10007:
            showMsg("不支持的MediaType (%s)")
        case 10008:
            showMsg("参数错误，请参考API文档")
        case 10009:
            showMsg("任务过多，系统繁忙")
        case 10010:
            showMsg("任务超时")
        case 10011:
            showMsg("RPC错误")
        case 10012:
            showMsg("非法请求")
        case 10013:
            showMsg("不合法的微博用户")
        case 10014:
            showMsg("应用的接口访问权限受限")
        case 10016:
            showMsg("缺失必选参数 (%s)，请参考API文档")
        case 10017:
            showMsg("参数值非法，需为 (%s)，实际为 (%s)，请参考API文档")
        case 10018:
            showMsg("请求长度超过限制")
        case 10020:
            showMsg("接口不存在")
        case 10021:
            showMsg("请求的HTTP METHOD不支持，请检查是否选择了正确的POST/GET方式")
        case 10022:
            showMsg("IP请求频次超过上限")
        case 10023:
            showMsg("用户请求频次超过上限")
        case 10024:
            showMsg("用户请求特殊接口 (%s) 频次超过上限")
//        case 20001:
//            showMsg("IDs参数为空")
//        case 20002:
//            showMsg("Uid参数为空")
//        case 20003:
//            showMsg("用户不存在")
//        case 20005:
//            showMsg("不支持的图片类型，仅仅支持JPG、GIF、PNG")
//        case 20006:
//            showMsg("图片太大")
//        case 20007:
//            showMsg("请确保使用multpart上传图片")
//        case 20008:
//            showMsg("内容为空")
//        case 20009:
//            showMsg("IDs参数太长了")
//        case 20012:
//            showMsg("输入文字太长，请确认不超过140个字符")
//        case 20013:
//            showMsg("输入文字太长，请确认不超过300个字符")
//        case 20014:
//            showMsg("安全检查参数有误，请再调用一次")
//        case 20015:
//            showMsg("账号、IP或应用非法，暂时无法完成此操作")
//        case 20016:
//            showMsg("发布内容过于频繁")
//        case 20017:
//            showMsg("提交相似的信息")
//        case 20018:
//            showMsg("包含非法网址")
//        case 20019:
//            showMsg("提交相同的信息")
//        case 20020:
//            showMsg("包含广告信息")
//        case 20021:
//            showMsg("包含非法内容")
//        case 20022:
//            showMsg("此IP地址上的行为异常")
//        case 20031:
//            showMsg("需要验证码")
//        case 20032:
//            showMsg("发布成功，目前服务器可能会有延迟，请耐心等待1-2分钟")
//        case 20101:
//            showMsg("不存在的微博")
//        case 20102:
//            showMsg("不是你发布的微博")
//        case 20103:
//            showMsg("不能转发自己的微博")
//        case 20104:
//            showMsg("不合法的微博")
//        case 20109:
//            showMsg("微博ID为空")
//        case 20111:
//            showMsg("不能发布相同的微博")
//        case 20201:
//            showMsg("不存在的微博评论")
//        case 20202:
//            showMsg("不合法的评论")
//        case 20203:
//            showMsg("不是你发布的评论")
//        case 20204:
//            showMsg("评论ID为空")
//        case 20301:
//            showMsg("不能给不是你粉丝的人发私信")
//        case 20302:
//            showMsg("不合法的私信")
//        case 20303:
//            showMsg("不是属于你的私信")
        case 21301:
            showMsg("OAuth2.0认证失败")
        default:
            showMsg("API未知错误")
        }
    }
    
    fileprivate func showMsg(_ msg: String) {
        UIApplication.shared.keyWindow?.chrysan.showPlainMessage(msg, hideDelay: 1)
    }
}
